home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume2 / intuitin / closeme.1 next >
Text File  |  1988-10-29  |  10KB  |  334 lines

  1. Path: xanth!nic.MR.NET!tank!ncar!mailrus!ulowell!page
  2. From: page@swan.ulowell.edu (Bob Page)
  3. Newsgroups: comp.sources.amiga
  4. Subject: v02i038:  closeme - a display hack
  5. Message-ID: <9926@swan.ulowell.edu>
  6. Date: 29 Oct 88 02:18:27 GMT
  7. Organization: University of Lowell, Computer Science Dept.
  8. Lines: 319
  9. Approved: page@swan.ulowell.edu
  10.  
  11. Submitted-by: page@swan.ulowell.edu (Bob Page)
  12. Posting-number: Volume 2, Issue 38
  13. Archive-name: intuition/closeme.1
  14.  
  15. [I lost the original submitter's name, sorry. ..Bob]
  16.  
  17. # This is a shell archiv
  18. e.  Remove anything before this line
  19. # then unpack it by saving it in a file and typing "sh file"
  20. # (Files unpacked will be owned by you and have default permissions).
  21. # This archive contains the following files:
  22. #    Makefile
  23. #    CloseMe.c
  24. #
  25. if `test ! -s Makefile`
  26. then
  27. echo "writing Makefile"
  28. cat > Makefile << '\SHAR_EOF'
  29. #
  30. # Makefile for Manx aztec C.
  31. #
  32. .c.o:
  33.     cc -o $*.o +L $*.c
  34.  
  35. CloseMe:    CloseMe.o
  36.     ln -o CloseMe CloseMe.o -lc32
  37. \SHAR_EOF
  38. else
  39.   echo "will not over write Makefile"
  40. fi
  41. if [ `wc -c Makefile | awk '{printf $1}'` -ne 110 ]
  42. then
  43. echo `wc -c Makefile | awk '{print "Got " $1 ", Expected " 110}'`
  44. fi
  45. if `test ! -s CloseMe.c`
  46. then
  47. echo "writing CloseMe.c"
  48. cat > CloseMe.c << '\SHAR_EOF'
  49. /*
  50.     CloseMe - a display hack by Charlie Gibbs
  51.  
  52.     This version was compiled on April 13, 1988.
  53.  
  54.     This program started out as a simple exercise in using
  55.     Intuition's facilities, but I decided that if I'm going to
  56.     learn about Intuition, I might as well have fun doing it.
  57.  
  58.     Special thanks goes to Larry Phillips for providing the basic
  59.     idea, and to Leo Schwab for inspiring me to such perversions.
  60.  
  61.     This program opens up a screen of its own unless you run it
  62.     from the CLI with a -w switch on the command line.  For some
  63.     reason, it bogs down horribly when running on the Workbench
  64.     screen, and steals some memory that it never gives back,
  65.     although it behaves itself when run in a screen of its own.
  66.     If anyone can tell me why it does this, I'd really appreciate it.
  67. */
  68.  
  69. #include <intuition/intuition.h>
  70.  
  71. #ifdef AZTEC_C
  72. #   include <functions.h>
  73. #endif
  74.  
  75. struct IntuitionBase *IntuitionBase;
  76. struct GfxBase *GfxBase;
  77.  
  78. #define INTUITION_REV 0
  79. #define GRAPHICS_REV  0
  80. #define IMSG    struct IntuiMessage
  81.  
  82. int SeparateScreen = 1;    /* Set to zero to play on the Workbench screen. */
  83.  
  84. SHORT bounce[] = {21, 15, 13, 9, 7, 5, 3, 1, 0};
  85.  
  86. struct NewScreen NewScreen = {
  87.     0, 0, 640, 200, 2,        /* LeftEdge, TopEdge, Width, Height, Depth */
  88.     0, 1,            /* DetailPen, BlockPen */
  89.     HIRES, CUSTOMSCREEN,    /* ViewModes, Type */
  90.     NULL,            /* Font */
  91.     (UBYTE *)"Oh no, Charlie's acting strange again.",    /* DefaultTitle */
  92.     NULL, NULL };        /* Gadgets, CustomBitMap */
  93.  
  94. struct NewWindow NewWindow = {
  95.     20, 20, 300, 50,        /* LeftEdge, TopEdge, Width, Height */
  96.     0, 1,            /* DetailPen, BlockPen */
  97.     CLOSEWINDOW | MOUSEMOVE,    /* IDCMPFlags */
  98.     WINDOWCLOSE | SMART_REFRESH | ACTIVATE | NOCAREREFRESH,    /* Flags */
  99.     NULL, NULL,            /* FirstGadget, CheckMark */
  100.     (UBYTE *)"CloseMe",        /*
  101.  Title */
  102.     NULL, NULL,            /* Screen, BitMap */
  103.     1, 1, 640, 200,        /* MinWidth, MinHeight, MaxWidth, MaxHeight */
  104.     WBENCHSCREEN } ;        /* Type */
  105.  
  106.         
  107. main(argc, argv) int argc; char *argv[];
  108. {
  109.     struct Screen *Screen;
  110.     struct Window *Window;
  111.     IMSG  *message;
  112.     ULONG cl;            /* Current message class */
  113.     SHORT mx, my;        /* Current mouse co-ordinates */
  114.     SHORT dx, dy;        /* Distance to move the window */
  115.     SHORT maxx, maxy;        /* Don't move the window past here! */
  116.     BOOL mousemove;        /* We got a MOUSEMOVE event. */
  117.     int i;
  118.  
  119.     maxx = NewWindow.MaxWidth - NewWindow.Width - 20;
  120.     maxy = NewWindow.MaxHeight - NewWindow.Height - 10;
  121.  
  122. /* Open libraries (the startup module already took care of dos.library) */
  123.  
  124.     IntuitionBase = (struct IntuitionBase *)
  125.     OpenLibrary ("intuition.library", INTUITION_REV);
  126.     if (IntuitionBase == NULL)
  127.     exit (10);
  128.     GfxBase = (struct GfxBase *) OpenLibrary ("graphics.library", GRAPHICS_REV);
  129.     if (GfxBase == NULL)
  130.     exit (10)
  131. ;
  132.  
  133. /* If desired, open a custom screen to work in.
  134.     The -w command-line switch makes it go to the Workbench screen. */
  135.  
  136.     for (i = 1; i < argc; i++) {
  137.     if ((argv[i][0] == '-')
  138.     && (argv[i][2] == '\0')
  139.     && (toupper (argv[i][1]) == 'W')) {
  140.         SeparateScreen = FALSE;
  141.         break;
  142.     }
  143.     }
  144.     if (SeparateScreen) {
  145.     if ((Screen = (struct Screen *) OpenScreen (&NewScreen)) == NULL)
  146.         exit (10);
  147.     NewWindow.Screen = Screen;
  148.     NewWindow.Type = CUSTOMSCREEN;
  149.     }
  150.  
  151. /* Open a window and display some text. */
  152.  
  153.     if ((Window = (struct Window *) OpenWindow (&NewWindow)) == NULL)
  154.     exit (10);
  155.     Move (Window->RPort, 20, 20);
  156.     Text (Window->RPort, "Go ahead, try to close me.", 26);
  157.  
  158.  
  159. /* If the user tries to close the window, jump out of the way.
  160.     Since the only event that can happen right now is WINDOWCLOSE,
  161.     we can Wait() for anything and not bother testing what we get. */
  162.  
  163.     Wait (1 << Window->UserPort->mp_SigBit);
  164.     MoveWindow (Window, 100L, 60L);
  165.     NewWindow.LeftEdge += 100;
  166.     NewWindow.TopEdge += 60;
  167.     Move (Window->RPort, 20, 20);
  168.     Text (Window->RPort, "Ha ha, you missed.  Try again.", 30);
  169.  
  170.  
  171. /* Jump away when he tries the next time too. */
  172.  
  173.     Wait (1 << Window->UserPort->mp_SigBit);
  174.     MoveWindow (Window, 100L, -30L);
  175.     NewWindow.LeftEdge += 100;
  176.     NewWindow.TopEdge -= 30;
  177.     Move (Window->RPort, 20, 20);
  178.     Text (Window->RPort, "Catch me if you can!          ", 30);
  179.  
  180.  
  181. /* Run away from the mouse.  We CAN be cornered, though. */
  182.  
  183.     ReportMouse (TRUE, Window);    /* Turn on reporting of mouse movements. */
  184.     mousemove = FALSE;
  185.     FOREVER {
  186.     Wait (1 << Window->UserPort->mp_SigBit);    /* Wait for action. */
  187.     while (message = (IMSG *)GetMsg (Window->UserPort)) {
  188.         if ((cl = message->Class) & MOUSEMOVE) {
  189.         mousemove = TRUE;        /* It's a mouse movement. */
  190.         mx = message->MouseX;        /* Save mouse co-ordinates. */
  191.         my = message->MouseY;
  192.         }
  193.         ReplyMsg (message);        /* Reply ASAP - there might be more! */
  194.  
  195.         if ((cl & CLOSEWINDOW)    /* If he caught the close gadget   */
  196.         && !mousemove        /*  in the middle of the screen... */
  197.         && (((NewWindow.LeftEdge > 0) && (NewWindow.LeftEdge < maxx))
  198.         || ((NewWindow.TopEdge > 0) && (NewWindow.TopEdge < maxy)))) {
  199.             mousemove = TRUE;        /*  ...fake a mouse movement. */
  200.             if (NewWindow.LeftEdge + 20 > maxx)
  201.             mx = 17;
  202.             else
  203.             mx = 15;
  204.             if (NewWindow.TopEdge + 10 > maxy)
  205.             my = 6;
  206.             else
  207.             my = 4;
  208.         }
  209.     }
  210.     if (mousemove) {
  211.         dx = mx - 16;
  212.     /* Adjust to center of close gadget. */
  213.         dy = my - 5;
  214.         if (((dx * dx) / 4 + dy * dy) < 400) {    /* If he's near it... */
  215.         if (dx > 0)
  216.             if (NewWindow.LeftEdge < 20)
  217.             dx = -NewWindow.LeftEdge;    /* Stay on screen! */
  218.             else
  219.             dx = -20;
  220.         else
  221.             if (NewWindow.LeftEdge + 20 > maxx)
  222.             dx = maxx - NewWindow.LeftEdge;
  223.             else
  224.             dx = 20;
  225.         if (dy > 0)
  226.             if (NewWindow.TopEdge < 10)
  227.             dy = -NewWindow.TopEdge;
  228.             else
  229.             dy = -10;
  230.         else
  231.             if (NewWindow.TopEdge + 10 > maxy)
  232.             dy = maxy - NewWindow.TopEdge;
  233.             else
  234.             dy = 10;
  235.         MoveWindow (Window, (long) dx, (long) dy);    /* Run away. */
  236.         NewWindow.LeftEdge += dx;    /* Remember where we are. */
  237.         NewWindow.TopEdge += dy;
  238.         }
  239.         mousemove = FALSE;
  240.     }
  241.     if ((dx == 0) && (dy == 0)    /* He cornered us... */
  242.     && (cl & CLOSEWINDOW))        /* ...and hit the close gadget. */
  243.         break;
  244.     }
  245.     ReportMouse (FALSE, Window);    /* Turn off mouse reporting. */
  246.     Move (Window->RPort, 20, 20);
  247.     Text (Window->RPort, "Arrgh!  I'm cornered!", 21);
  248.  
  249.  
  250. /* Make him think he got rid of us. */
  251.  
  252.     Delay (100L);            /* Wait two seconds... */
  253.     CloseWindow (Window);        /*  ...then disappear. */
  254.     if (SeparateScreen)
  255.     CloseScreen (Screen);
  256.     Delay (150L);            /* Wait another three seconds. */
  257.     NewWindow.LeftEdge = NewWindow.TopEdge = 0;
  258.     if (SeparateScreen)
  259.     Screen = (struct Screen *) OpenScreen (&NewScreen);
  260.     Window = (struct Window *) OpenWindow (&NewWindow);
  261.     Move (Window->RPort, 20, 20);
  262.     Text (Window->RPort, "Bet you thought you had me.", 27);
  263.  
  264.  
  265. /* The next time he hits the close gadget, roll up the window. */
  266.  
  267.     Wait (1 << Window->UserPort->mp_SigBit);
  268.     Move (Window->RPort, 20, 20);
  269.     Text (Window->RPort, "Augghhh!  I'm melting!     ", 27);
  270.     while (NewWindow.Height > 10) {
  271.     SizeWindow (Window, 0L, -5L);    /* Shrink vertically... */
  272.     NewWindow.Height -= 5;
  273.     }
  274.     while (NewWindow.Width > 30) {
  275.     SizeWindow (Window, -10L, 0L);    /*  ...then horizontally. */
  276.     NewWindow.Width -= 10;
  277.     }
  278.  
  279.  
  280. /* Now fall and bounce across the floor. */
  281.  
  282.     Wait (1 << Window->UserPort->mp_SigBit);
  283.     for (i = 0, dy = 1; i < 190; dy += 2) {    /* Fall down... */
  284.     if (i + dy > 190)            /*  ...but don't go    */
  285.         dy = 190 - i;            /*  through the floor! */
  286.     MoveWindow (Window, 6L, (long) dy);
  287.     i += dy;
  288.     }
  289.     for (i = 0; bounce[i]; i++) {
  290.     for (dy = -bounce[i]; dy < 0; dy += 2)
  291.         MoveWindow (Window, 6L, (long) dy);        /* Bounce up. */
  292.     for (dy = 1; dy <= bounce[i]; dy += 2)
  293.         MoveWindow (Window, 6L, (long) dy);        /* Fall back down. */
  294.     }
  295.  
  296.  
  297. /* Let him finally get rid of us. */
  298.  
  299.     Wait (1 << Window->UserPort->mp_SigBit);
  300.     ModifyIDCMP (Window, (long) NEWSIZE);    /* Listen for sizing only */
  301.  
  302.     while (NewWindow.Height > 1) {
  303.     SizeWindow (Window, -3L, -1L);    /* Shrink the close gadget... */
  304.     Wait (1 << Window->UserPort->mp_SigBit);
  305.     NewWindow.Height -= 1;
  306.     NewWindow.Width -= 3;
  307.     }
  308.     SizeWindow (Window, -2L, 0L);    /*  ...down to a single pixel... */
  309.     WaitPort (Window->UserPort);
  310.     message = (IMSG *)GetMsg (Window->UserPort);
  311.     ReplyMsg (message);
  312.     Delay (50);
  313.     CloseWindow (Window);        /*  ...then close it completely. */
  314.  
  315.     if (SeparateScreen)
  316.     CloseScreen (Screen);
  317.     CloseLibrary (IntuitionBase);
  318.     CloseLibrary (GfxBase);
  319. }
  320. \SHAR_EOF
  321. else
  322.   echo "will not over write CloseMe.c"
  323. fi
  324. if [ `wc -c CloseMe.c | awk '{printf $1}'` -ne 8521 ]
  325. then
  326. echo `wc -c CloseMe.c | awk '{print "Got " $1 ", Expected " 8521}'`
  327. fi
  328. echo "Finished archive 1 of 1"
  329. # if you want to concatenate archives, remove anything after this line
  330. exit
  331. -- 
  332. Bob Page, U of Lowell CS Dept.  page@swan.ulowell.edu  ulowell!page
  333. Have five nice days.
  334.